
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>SpringBoot中暗藏的设计模式 - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>SpringBoot中暗藏的设计模式 - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">文档中如何解释工厂模式在SpringBoot中的体现？并以什么作为比喻？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">文档将SpringBoot中的工厂模式比喻为去奶茶店点单。开发者只需告诉框架需要什么（如通过@Autowired注入Bean），SpringBoot的ApplicationContext（超级工厂）就会像后厨一样自动完成对象的创建和配置，开发者几乎不需要自己new对象。</div>
          </div>
          <div class="card-source">来源: 一、工厂模式</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">SpringBoot默认情况下如何管理Bean，这体现了哪种设计模式？并举例说明如何通过注解实现。</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">SpringBoot默认通过单例模式（Singleton Pattern）来管理Bean，确保核心组件只有一个实例。例如，在类上使用@Service注解，Spring容器就会将其作为单例Bean进行管理。</div>
          </div>
          <div class="card-source">来源: 二、单例模式</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">什么是模板方法模式？请根据文档描述其核心思想，并列举一个Spring中的经典实现。</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">模板方法模式的核心思想是定义一个算法的骨架（模板方法），并将其中一些具体的步骤延迟到子类中去实现。这允许子类在不改变算法结构的情况下，重写该算法的特定步骤。Spring中的JdbcTemplate的execute方法是该模式的经典实现。</div>
          </div>
          <div class="card-source">来源: 三、模板方法模式</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">Spring AOP的核心机制基于哪种设计模式？当我们在方法上使用@Transactional注解时，发生了什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Spring AOP的核心机制基于代理模式（Proxy Pattern）。当在方法上使用@Transactional注解时，Spring会为该类创建一个代理对象，这个代理对象会在调用原始方法前后自动开启、提交或回滚事务。</div>
          </div>
          <div class="card-source">来源: 四、代理模式</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">Spring AOP中使用的两种动态代理技术是什么？它们的主要区别是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">两种动态代理技术是JDK动态代理和CGLIB代理。主要区别在于实现方式：JDK动态代理基于接口代理，要求目标类必须实现接口；而CGLIB代理通过继承目标类来实现，不需要接口。</div>
          </div>
          <div class="card-source">来源: 四、代理模式</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">Spring的事件机制是哪种设计模式的体现？构成该机制的三个核心组件是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Spring的事件机制是观察者模式（Observer Pattern）的体现。其三个核心组件是：ApplicationEvent（事件）、ApplicationListener（监听器）和ApplicationEventPublisher（事件发布者）。</div>
          </div>
          <div class="card-source">来源: 五、观察者模式</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">使用观察者模式（如Spring事件机制）进行系统设计，其主要优点是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">主要优点是实现了解耦，使得系统扩展变得容易。当需要增加新的业务逻辑（如订单创建后发送邮件）时，只需添加一个新的监听器即可，而无需修改原有的订单创建逻辑代码。</div>
          </div>
          <div class="card-source">来源: 五、观察者模式</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">文档中提到的适配器模式在Spring MVC中的经典应用是什么？它解决了什么问题？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">适配器模式在Spring MVC中的经典应用是HandlerAdapter。它解决了DispatcherServlet如何统一调用各种不同类型处理器（Handler）的问题，例如处理@Controller注解的控制器或实现了HttpRequestHandler接口的类，HandlerAdapter使其能够被统一处理。</div>
          </div>
          <div class="card-source">来源: 六、适配器模式</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">除了常见的@Component系列注解，文档还提到了哪两种实现单例模式的方式及其优点？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">文档还提到了两种方式：1. 使用@Bean注解，优点是配置灵活；2. 使用枚举（enum）实现，优点是可以防止反射攻击。</div>
          </div>
          <div class="card-source">来源: 二、单例模式</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
